

package stamboom;

import java.io.*;
import java.util.*;




public class Administratie {

    //************************datavelden*************************************
    
    private ArrayList<Persoon> personen;
    private int nextGezinsNr;
    private int nextPersNr;
    private DatabeesKneksie dk;

    //***********************constructoren***********************************

    /**
     * er wordt een administratie gecreeerd met 0 personen en dus 0 gezinnen
     * personen en gezinnen die in de toekomst zullen worden gecreeerd, 
     * worden elk opvolgend genummerd vanaf 1
     */
    public Administratie() {
        personen = new ArrayList<Persoon>();
        nextGezinsNr = 1;
        nextPersNr = 1;
        dk = new DatabeesKneksie();
        //todo
    }
    
    

    //**********************methoden****************************************

     /**
     * er wordt een persoon met een gegeven geslacht, met als
     * voornamen vnamen, achternaam anaam, tussenvoegsel tvoegsel, geboortedatum
     * gebdat en een gegeven ouderlijk gezin; de persoon krijgt een uniek nummer
     * toegewezen de creatie van deze persoon is voortaan ook bij het ouderlijk
     * gezin bekend. Alleen de parameter ouderlijkGezin mag de waarde null 
     * hebben. 
     */
    public void addPersoon(Geslacht geslacht, String[] vnamen, String anaam,
            String tvoegsel, GregorianCalendar gebdat, Gezin ouderlijkGezin) {
        // TODO
        this.personen.add(new Persoon(nextPersNr, vnamen, anaam, tvoegsel, gebdat, geslacht, ouderlijkGezin));
        nextPersNr++;
    }

    /**
     * @param m1 m1 ongeljk aan m2
     * @param m2
     * er wordt een (kinderloos) gezin met m1 en m2 als ouders gcreeerd;
     * de huwelijks- en scheidingsdatum zijn onbekend (null); het gezin
     * krijgt een uniek nummer toegewezen
     */
    public void addGezin(Persoon m1, Persoon m2) {
        // gecreeerd object wordt niet aan variabele gekoppeld; zie code
        // constructor van de klasse Gezin:
        if (m1!=m2) {
        //try{
        new Gezin(nextGezinsNr, m1, m2);
//        }
//        catch (RuntimeException x)
//        {
//            System.out.println(x.getMessage());
//        }
        nextGezinsNr++;}
    }

    /**
     *
     * @param nr
     * @return de persoon met nummer nr, als die niet bekend is wordt er null
     * geretourneerd
     */
    public Persoon getPersoon(int nr) {
        //todo
        return personen.get(nr - 1);
    }

    /**
     * @return alle personen met een achternaam gelijk aan de meegegeven achternaam
     */
    public ArrayList<Persoon> getPersonen(String achternaam) {
        //todo
        ArrayList<Persoon> personen = new ArrayList<Persoon>();
        
        
        for (Persoon p: this.personen) {
            if (p.getAchternaam().toLowerCase().equals(achternaam.toLowerCase())){
            personen.add(p);
            }
        }
        return personen;
    }

    /**
     *
     * @param gezinsNr
     * @return het gezin met nummer nr. Als dat niet bekend is wordt er null
     * geretourneerd
     */
    public Gezin getGezin(int gezinsNr) {
        // inefficiente oplossing
        for (Persoon p : personen) {
            Iterator<Gezin> it = p.getGezinnen();
            while (it.hasNext()) {
                Gezin r = it.next();
                if (r.getNr() == gezinsNr) {
                    return r;
                }
            }
        }
        return null;
    }
    public Iterator<Persoon> getAllepersonen(){
        return personen.iterator();
    }
    
    public int getNextPersNr() {
        return nextPersNr;
    }

    public int getNextGezinsNr() {
        return nextGezinsNr;
    }
    
    /**
  * er wordt een Administratie gecreëerd en gevuld aan de hand van de
  * gegevens in het bestand met de naam naamBron
  * @param naamBron een geserialiseerd objectbestand met 
  * persoonsgegevens, gevolgd door de 2 getallen die resp. betrekking 
  * hebben op een eerstvolgend persoonsnummer en gezinsnummer
  */
public Administratie(String naamBron) 
        throws IOException, ClassNotFoundException{
    FileInputStream fis = new FileInputStream(naamBron);
    try{
        ObjectInputStream ois = new ObjectInputStream(fis);
        this.personen = (ArrayList<Persoon>) ois.readObject();
        this.nextPersNr = ois.readInt();
        this.nextGezinsNr= ois.readInt();
        
    }
    catch(Exception ex){
        
    }
        dk = new DatabeesKneksie();
    
    
            
            
}

/**
  * de persoonsgegevens worden weggeschreven in een geserialiseerd 
  * bestand met de naam naamBestemming, eerst worden de 
  * persoonsgegevens weggeschreven en vervolgens het eerstvolgende 
  * nieuwe persoonsnummer gevolgd door het nieuwe relatienummer
  * @param naamBestemming
  */
public void save(String naamBestemming){
    try{
        FileOutputStream fos = new FileOutputStream(naamBestemming);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
         oos.writeObject(this.personen);
         oos.writeInt(nextPersNr);
         oos.writeInt(nextGezinsNr);
    
    }catch (IOException ex){
        System.out.println(ex.getMessage());  
    }
}
public Persoon getPersoonDoorNaam(String naam){
    for(Iterator<Persoon> it = getAllepersonen(); it.hasNext();){
       Persoon p = it.next();
       if(p.toString().equals(naam)){
           return p;
       }
    }
    return null;
}

public Iterator<Gezin> gezinnen() {

        // inefficiente oplossing

        ArrayList<Gezin> gezinnen;
        gezinnen = new ArrayList<>();

        for (Persoon persoon : personen){

            Iterator<Gezin> it = persoon.getGezinnen();

            while(it.hasNext()){

                Gezin g = it.next();

                if (!gezinnen.contains(g)) {

                    gezinnen.add(g);

                }

            }

        }

        return gezinnen.iterator();

    }   

public void saveDB()
{
    if (dk.connect())
    {
    dk.savePeople(personen);
    dk.disconnect();
    }
  
   if (dk.connect())
    {
    dk.saveGezin(Gezin.gezinlist);
    dk.disconnect();
    }
    
            
}

    public void save(File aa) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }


}